package com.agri.controller;

import com.agri.dto.FinancingApplyDTO;
import com.agri.dto.FinancingAuditDTO;
import com.agri.exception.FinancingException;
import com.agri.result.Result;
import com.agri.service.FinancingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

/**
 * 融资控制器
 * 提供融资申请、进度查询、审批等RESTful接口
 *
 * @author Agri-Fin-Sale Team
 * @version 1.0
 * @since 2025-10-30
 */
@RestController
@RequestMapping("/financing")
public class FinancingController {
    @Autowired
    private FinancingService financingService;

    /**
     * 提交融资申请
     * 接收用户融资申请信息，创建新的融资订单
     *
     * @param dto 融资申请数据传输对象
     * @return Result<?> 包含订单编号的成功结果
     */
    @PostMapping("/apply")
    public Result<?> apply(@Valid @RequestBody FinancingApplyDTO dto) {
        return financingService.apply(dto);
    }

    /**
     * 查询融资进度
     * 根据订单编号查询融资订单的当前进度信息
     *
     * @param orderNo 订单编号
     * @return Result<?> 包含订单进度信息的结果
     */
    @GetMapping("/progress/{orderNo}")
    public Result<?> getProgress(@PathVariable String orderNo) {
        return financingService.getProgress(orderNo);
    }

    /**
     * 审批融资申请
     * 管理员审批融资订单，更新审批状态和意见
     * 需要ADMIN角色权限
     *
     * @param orderNo 订单编号
     * @param dto 审批数据传输对象
     * @return Result<?> 审批结果
     */
    @PutMapping("/audit/{orderNo}")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<?> audit(@PathVariable String orderNo, @Valid @RequestBody FinancingAuditDTO dto) {
        return financingService.audit(orderNo, dto);
    }

    /**
     * 更新订单状态
     * 管理员手动更新融资订单状态
     * 需要ADMIN角色权限
     *
     * @param orderNo 订单编号
     * @param status 目标状态代码
     * @return Result<?> 更新结果
     */
    @PutMapping("/status/{orderNo}")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<?> updateStatus(@PathVariable String orderNo, @RequestParam Integer status) {
        return financingService.updateStatus(orderNo, status);
    }

    /**
     * 查询融资订单列表
     * 管理员查询所有融资订单，支持按状态筛选
     * 需要ADMIN角色权限
     *
     * @param status 订单状态代码（可选）
     * @return Result<?> 包含订单列表的结果
     */
    @GetMapping("/list")
    @PreAuthorize("hasRole('ADMIN')")
    public Result<?> list(@RequestParam(required = false) Integer status) {
        return financingService.list(status);
    }
}